package com.lanjiyin.cloud.common.util.security;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

import org.apache.commons.lang3.StringUtils;

/**
 * 签名工具类
 * @author tudaojun
 *
 */
public class SignUtil {
	/**
	 * 创建签名
	 * @Title: createSign   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param accountKey
	 * @param: @param parameters
	 * @param: @param originalSign
	 * @param: @param separator
	 * @param: @param ignoreKey
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	public static String createSign(String key, Map<String,Object> parameters,String separator, String ignoreKey) {
		String parameterStr = parameterText(parameters,separator,ignoreKey)+key;
		parameterStr = MD5.md5(MD5.md5(parameterStr)).toLowerCase();
		return parameterStr;
	}
	/**
	 * 验证签名
	 * @Title: verifySign   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param accountKey
	 * @param: @param parameters
	 * @param: @param originalSign
	 * @param: @param separator
	 * @param: @param ignoreKey
	 * @param: @return      
	 * @return: boolean      
	 * @throws
	 */
	public static boolean verifySign(String key, Map<String,Object> parameters,String originalSign,String separator, String ignoreKey) {
		String signStr = createSign(key, parameters,separator, ignoreKey);
		return originalSign.equals(signStr);
	}
	/**
    *
    * 把数组所有元素排序，并按照“参数=参数值”的模式用“@param separator”字符拼接成字符串
    * @param parameters 参数
    * @return 去掉空值与签名参数后的新签名，拼接后字符串
    */
   public static String parameterText(Map parameters) {
       return parameterText(parameters, "&");
   }

   /**
    *
    * 把数组所有元素排序，并按照“参数=参数值”的模式用“@param separator”字符拼接成字符串
    * @param parameters 参数
    * @param separator 分隔符
    * @return 去掉空值与签名参数后的新签名，拼接后字符串
    */
   public static String parameterText(Map parameters, String separator) {
       return parameterText(parameters, separator, "sign");
   }
   /**
    * 按指定分隔符将字符串拆分成Map
    * @param param
    * @param separator
    * @param ignoreKey 排除参数
    * @return      
    * Map<String,Object>
    */
   public static Map<String,Object> splitParameterText(String param,String separator,String ignoreKey){
	   Map<String,Object> map = new HashMap<>();
	   if(StringUtils.isBlank(param)) {
		   return map;
	   }
	   String[] arr = param.split("&");
       for (String s : arr){
            String key = s.split("=")[0];
            String value = s.split("=")[1];
            if(StringUtils.isNotBlank(ignoreKey)) {
            	if(!ignoreKey.equals(key)) {
            		map.put(key,value);
            	}
            }else {
            	map.put(key,value);
            }
       }
	   return map;
   }
   
   /**
    *
    * 把数组所有元素排序，并按照“参数=参数值”的模式用“@param separator”字符拼接成字符串
    * @param parameters 参数
    * @param separator 分隔符
    * @param ignoreKey 需要忽略添加的key
    * @return 去掉空值与签名参数后的新签名，拼接后字符串
    */
   public static String parameterText(Map parameters, String separator, String ignoreKey ) {
       if(parameters == null){
           return "";
       }
       StringBuffer sb = new StringBuffer();
       // TODO 2016/11/11 10:14 author: egan 已经排序好处理
       if (parameters instanceof SortedMap) {
           for (String k : ((Set<String>) parameters.keySet())) {
               Object v = parameters.get(k);
               if (null == v || "".equals(v.toString().trim()) || (null != ignoreKey && ignoreKey.equals(k))) {
                   continue;
               }
               sb.append(k ).append("=").append( v.toString().trim()).append(separator);
           }
           if (sb.length() > 0 && !"".equals(separator)) {
               sb.deleteCharAt(sb.length() - 1);
           }
           return sb.toString();

       }
       // TODO 2016/11/11 10:14 author: egan 未排序须处理
       List<String> keys = new ArrayList<String>(parameters.keySet());
       //排序
       Collections.sort(keys);
       for (String k : keys) {
           String valueStr = "";
           Object o = parameters.get(k);
           if (o instanceof String[]) {
               String[] values = (String[]) o;
               if (null == values){continue;}
               for (int i = 0; i < values.length; i++) {
                   String value = values[i].trim();
                   if ("".equals(value)){ continue;}
                   valueStr += (i == values.length - 1) ?  value :  value + ",";
               }
           } else if (o != null) {
               valueStr = o.toString();
           }
           if (null == valueStr || "".equals(valueStr.toString().trim()) || (null != ignoreKey && ignoreKey.equals(k))) {
               continue;
           }
           sb.append(k ).append("=").append( valueStr).append(separator);
       }
       if (sb.length() > 0) {
           sb.deleteCharAt(sb.length() - 1);
       }
       return sb.toString();
   }
   public static void main(String[] args) {
	   Map<String,Object> params = new HashMap<>();
//	   long timespan = System.currentTimeMillis();
	   long timespan = 1596006598000L;
	   params.put("cardNo", "230828198904014317");
	   params.put("realName", "徐洪喜");
	   params.put("idCardUrl", "http://img.xinjianggong.com/oss/20200729/1e258eafb79047119846ea9b7d149cd5.jpg,http://img.xinjianggong.com/oss/20200729/2462e6fea1c84f6b9ce3b77ef25a5375.png");
	   params.put("timespan", timespan);
	   String sign = createSign("loNgJiang84n03uS4yas", params, "&", "sign");
	   System.out.println(timespan);
	   System.out.println(sign);
   }
}
